#coding: utf8
from Carta import Carta
import random 

#Este jugador tirará cartas al azar pero siempre respetando las reglas del juego
#El jugador inteligente será implementado en otra clase 

class Jugador(object):
	"""Clase que representa a un jugador de Corazones"""

	def __init__(self, id_jugador, nombre):
		"""Crea el jugador desde su id y su nombre. El id es un numero en el rango 0..3"""
		self.id_jugador = id_jugador
		self.nombre = nombre
		self.mano = []

	def obtener_id_jugador(self):
		"""Devuelve el id del jugador"""
		return self.id_jugador

	def recibir_carta(self, carta):
		"""Recibe una carta y la agrega a su mano"""
		self.mano.append(carta)

	def es_primero(self):
		"""Devuelve True si el usuario tiene el 2 de treboles"""
		return Carta(2, Carta.TREBOLES) in self.mano

	def devolver_cartas_a_pasar(self, id_jugador):
		"""Antes de comenzar la mano, retira de su mano y devuelve 3 cartas para
		pasarle al oponente con id id_jugador"""
		cartas_a_pasar = []
		for x in range (3):
			i_carta_a_pasar = random.randint(0,len(self.mano)-1)
			cartas_a_pasar.append(self.mano.pop(i_carta_a_pasar))
		return cartas_a_pasar	
		
	def recibir_cartas_pasadas(self, id_jugador, cartas):
		"""Antes de comenzar la mano y despues de haber devuelto sus cartas, recibe
		3 cartas del oponente con id id_jugador"""
		self.mano += cartas

	def jugar_carta(self, nro_mano, nro_jugada, cartas_jugadas, corazon_jugado):
		"""Saca una carta de su mano y la devuelve jugandola. Recibe el numero de
		mano, el numero de jugada, las cartas ya jugadas en la mesa en esa jugada
		y un booleano que indica si ya se jugaron corazones en las jugadas previas.
		Si ya hay cartas_jugadas y el jugador posee una carta del palo de la primer
		carta debe jugarla obligatoriamente.
		Si nro_jugada es 1 y no hay cartas_jugadas, el jugador debe jugar el 2 de
		treboles.
		Si nro_jugada es 1 el jugador no puede jugar ni un corazon ni la Q de picas.
		Si no hay cartas_jugadas y corazon_jugado es False el jugador no podra jugar
		un corazon salvo que no tenga otra carta."""
		if nro_jugada == 1:
			# Si no se jugaron cartas (es el primero) juega el 2 de treboles
			if cartas_jugadas == []:
				for i in range (len(self.mano)):
					if self.mano[i] == Carta(2,Carta.TREBOLES):
						return self.mano.pop(i)
				raise ValueError ("Se le ha asignado de manera erronea el primer turno")
			# Si ya se jugaron cartas
				#si tiene una de trebol la devuelve
			i = 0
			for carta in self.mano:
				if carta.obtener_palo() == Carta.TREBOLES:
					return self.mano.pop(i)
				i += 1
			#si no tiene treboles, devuelve cualquiera excepto corazones y q de picas 
			i = 0
			for carta in self.mano:
				if carta.obtener_palo() != Carta.CORAZONES and not carta==Carta(12,Carta.PICAS):
					return self.mano.pop(i)
				i += 1
			raise ValueError ("Las cartas se repartieron de manera erronea")
		elif nro_jugada!=1 and cartas_jugadas != []:
			palo_en_juego = cartas_jugadas[0].obtener_palo()
			#si tiene una carta del palo en juego en mano, la devuelve
			i = 0
			for carta in self.mano:
				if carta.obtener_palo() == palo_en_juego:
					return self.mano.pop(i)
				i += 1
			#si no tiene ninguna carta del palo en juego
			if corazon_jugado:
				i_carta = random.randint(0,len(self.mano)-1)
				return self.mano.pop(i_carta)
			else:
				i_carta=random.randint(Carta.CORAZONES+1,len(self.mano)-1)
				return self.mano.pop(i_carta)
				
		elif nro_jugada!=1 and cartas_jugadas== []:
			#si ya se jugó un corazon devuelve cualquier carta
			if corazon_jugado:
				i_carta = random.randint(0,len(self.mano)-1)
				return self.mano.pop(i_carta)
			else:
				#si todavía no se jugó un corazon, devuelve cualquier carta que no sea de ese palo
				i = 0
				for carta in self.mano:
					if carta.obtener_palo() != Carta.CORAZONES:
						return self.mano.pop(i)
					i += 1
				#Si lo unico que tiene en la mano son cartas del palo CORAZONES devuelve una carta cualquiera
				i_carta = random.randint(0,len(self.mano)-1)
				return self.mano.pop(i_carta) 
				
	def conocer_jugada(self, cartas_jugadas, id_primer_jugador, id_jugador_que_levanto):
		"""Luego de terminada la jugada, se informa al jugador sobre las cartas que
		se jugaron, en que orden y cual fue el id del jugador que levanto las cartas
		del juego."""
		pass

	def __str__(self):
		"""Representacion del jugador"""
		return "%s (%d)" % (self.nombre, self.id_jugador)
